#ifndef __KAIZI_H__
#define __KAIZI_H__
#include "logger.hpp"
/*

    1、提供获取指定日志器的全局接口，避免用户自己操作单例对象
    2、使用宏函数对日志器接口进行代理（代理模式）简化用户操作，用户不用再去输入文件名和行号的宏了
    3、提供宏函数，直接通过默认日志器进行日志的标准输出打印（不用获取日志器了）
*/
namespace kaizi
{
    // 1、提供获取指定日志器的全局接口，避免用户自己操作单例对象
    Logger::ptr getLogger(const std::string &name) // 获取指定名称的日志器
    {
        // 单例对象的获取
        return kaizi::LoggerManager::getInstance().getLogger(name); // 调用日志器管理器的获取日志器接口
    }
    Logger::ptr rootLogger() // 获取默认日志器
    {
        return kaizi::LoggerManager::getInstance().rootLogger();
    }

// 2、使用宏函数对日志器接口进行代理（代理模式）简化用户操作，用户不用再去输入文件名和行号的宏了
// 用户在使用的时候只需要传入两个参数就行了，自动传入文件名和行号
#define debug(fmt, ...) debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define info(fmt, ...) info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define warn(fmt, ...) warn(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define error(fmt, ...) error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define fatal(fmt, ...) fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

// 3、提供宏函数，直接通过默认日志器进行日志的标准输出打印（不用获取日志器了）
//  #define DEBUG(logger,fmt, ...) logger->debug(fmt, ##__VA_ARGS__)
//  #define DLOG(fmt, ...) DEBUG(rootLogger(),fmt, ##__VA_ARGS__)//rootlogger->debug(fmt,...)
#define DEBUG(fmt, ...) kaizi::rootLogger()->debug(fmt, ##__VA_ARGS__)
#define INFO(fmt, ...) kaizi::rootLogger()->info(fmt, ##__VA_ARGS__)
#define WARN(fmt, ...) kaizi::rootLogger()->wanr(fmt, ##__VA_ARGS__)
#define ERROR(fmt, ...) kaizi::rootLogger()->error(fmt, ##__VA_ARGS__)
#define FATAL(fmt, ...) kaizi::rootLogger()->fatal(fmt, ##__VA_ARGS__)

}

#endif
